#include<bits/stdc++.h>
using namespace std;
struct node
{
    int x,y;
}g[100100];
int n,m,L,V,T,k,d,v,a,now,o,tmp,ans,ansx,w[100100];
inline bool cmp(node xx,node yy)
{
    return xx.y<yy.y;
}
int main()
{
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    scanf("%d",&T);
    while(T--)
    {
        k=ans=ansx=0;
        scanf("%d%d%d%d",&n,&m,&L,&V);
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&d,&v);
            scanf("%d",&a);
            if(a==0)
            {
                if(v<=V)ans++;
                else
                {
                    g[++k]=(node){d,L};
                }
            }
            else
            if(a>0)
            {
                if(v>V)
                {
                    g[++k]=(node){d,L};
                }
                else
                {
                    o=(V*V-v*v)/(a<<1)+1;
                    o+=d;
                    if(o>L)
                    {
                        ans++;
                    }
                    else
                    {
                        g[++k]=(node){o,L};
                    }
                }
            }
            else
            {
                if(v<=V)ans++;
                else
                {
                    a=-a;
                    o=(v*v-V*V)/(a<<1);
                    if(o*(a<<1)==v*v-V*V)o--;
                    o+=d;
                    if(o>L)
                    {
                        g[++k]=(node){d,L};
                    }
                    else
                    {
                        g[++k]=(node){d,o};
                    }
                }
            }
        }
        for(int i=1;i<=m;i++)scanf("%d",&w[i]);
        sort(g+1,g+k+1,cmp);
        now=0;
        w[now]=-1;
        w[m+1]=1e8;
        //for(int i=1;i<=m;i++)cout<<w[i]<<"\n";
       // for(int i=1;i<=k;i++)
       /// {
//
        //    cout<<g[i].x<<" "<<g[i].y<<"\n";
       // }
        for(int i=1;i<=k;i++)
        {
            if(g[i].x<=w[now])continue;
            else
            {
                tmp=now;
                if(now==m||w[now+1]>g[i].y)
                {
                    ans++;
                }
                else
                {
                    while(now<=m&&w[now+1]<=g[i].y)
                    {
                        now++;
                    }
                    if(w[now]<g[i].x)
                    {ans++,now=tmp;
                        }
                    else
                    {
                        if(w[now]>=g[i].x&&w[now]<=g[i].y)
                        {
                            ansx++;
                        }
                    }
                }
            }
        //    cout<<ans<<" "<<ansx<<"\n";
        }
        printf("%d %d\n",n-ans,m-ansx);
    }
    return 0;
}
